import { VuexModule, Module, getModule, Action } from 'vuex-module-decorators'
import { WebchatModule } from '@/store/modules/webchat'
import { CommonModule } from '@/store/modules/common'
import store from '@/store'
import router from '@/router/handleRoute'
import Vue from 'vue'
import { Message } from 'element-ui'
import { instance } from '@/microPage/webchat/main'
import { noticeConfigModule } from '../config/notice'
import { commonAction } from '@/utils/common'
export interface WebchatEventState {
  webchatStatus: boolean
}
@Module({ dynamic: true, name: 'webchatEvent', store, namespaced: false })
class WebchatEvent extends VuexModule implements WebchatEventState {
  public webchatStatus = true

  @Action
  private webchatNotify (data: any) { // 在线通知
    const options = {
      dir: 'auto',
      icon: 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=405069346,3880007726&fm=11&gp=0.jpg',
      body: ''
    }
    const routePath = `/im_workBench/index/webchat_todo/${data.sessionId || data._id}`
    const message = '您有新的在线消息'
    CommonModule.NOTIFY({ title: '通知', message, options, routePath, notifyData: {} })
  }

  @Action
  public async handleWebchatEvent (event: any) {
    const data = event.body
    if (event.type && event.type === 'refreshWxkfConfig') {
      noticeConfigModule.AddRefreshTime()
    }
    if (event.body?.eventType === 'robotAssist') {
      WebchatModule.SET_AGENT_DATA(event.body || {})
    }
    if (data) {
      if (data.eventType === 'newMsg') { // 新消息事件
        if (data.contentType === 'voice') { // 如果是语音消息类型需增加播放初始化状态
          Vue.set(data, 'play', false)
        }
        // 把访客发送的消息放到消息数组中
        if (WebchatModule.webchatMessage.webchat_todo[data.sessionId]) {
          WebchatModule.webchatMessage.webchat_todo[data.sessionId].push(data)
          // 通知访客来消息
          WebchatModule.SET_WEBCHAT_MESSAGE_CHANGE(data)
        }
        // 更新会话上的未读消息数
        if (WebchatModule.webchatList.webchat_todo) {
          const currentRoute = router.currentRoute
          const currentRouteId = currentRoute.params.id
          WebchatModule.webchatList.webchat_todo.forEach((item: any) => {
            if (data.sessionId !== currentRouteId) { // 在当前会话页面不进行未读数累加
              if (item._id === data.sessionId) {
                if (!['system', 'csrInvite', 'csrSubmit'].includes(data.contentType)) { // 系统消息不算消息数
                  Vue.set(item, 'leakNum', item.leakNum + 1)
                }
              }
            }
          })
        }
        if (data.userId !== 'system') { // 系统消息更新卡片上最后一条消息
          WebchatModule.updateWebchatCardInfo({ obj: data, from: 'customer' })
          this.webchatNotify(data)
        }

        const currentScrollBottom = WebchatModule.msgBoxScrollBottom;
        if (currentScrollBottom > 70) {
          const currentType = router.currentRoute.path.split('/')[3]
          if (currentType && currentType === 'webchat_todo') {
            const currentMessageId = router.currentRoute.path.split('/')[4]
            if (currentMessageId && currentMessageId !== 'empty') {
              const messageList = WebchatModule.webchatMessage.webchat_todo[currentMessageId]
              if (WebchatModule.unreadmessages === 0) {
                WebchatModule.SET_UNREAD_MESSAGESID('msg' + (messageList.length - 1))
              }
              WebchatModule.SET_UNREAD_MESSAGE('add');
            }
          }
        }
      } else if (data.eventType === 'newChat') { // 新会话事件
        data.newChatList.forEach((item: any) => {
          WebchatModule.SET_WEBCHAT_LIST({ submenu: 'webchat_todo', list: item, newChat: true })
          // 排队数处理
          const sendData = { peerId: item.toPeer, convertManualTimestamp: item.convertManualTimestamp }
          const pushQueueActionData = { url: '/im-center/action/webchat/pushQueueNumToVistor', method: 'POST', data: sendData }
          WebchatModule.webchatCommonAction(pushQueueActionData)
          // 未读消息数
          Vue.set(item, 'leakNum', item.leakNum + 1)
          this.webchatNotify(item)
        })
      } else if (data.eventType === 'disConn') { // 访客离线事件
        if (WebchatModule.webchatMessage.webchat_todo[data.sessionId]) { // 把 当前消息放到会话历史里
          WebchatModule.webchatMessage.webchat_todo[data.sessionId].push(data)
        }
        WebchatModule.UPDATE_WEBCHAT_LIST_STATUS({ data, isVisitorBreak: true }) // 更新卡片上访客状态
      } else if (data.eventType === 'newConn') { // 访客接入事件
        if (WebchatModule.webchatMessage.webchat_todo[data.sessionId]) { // 把 当前消息放到会话历史里
          WebchatModule.webchatMessage.webchat_todo[data.sessionId].push(data)
        }
        WebchatModule.UPDATE_WEBCHAT_LIST_STATUS({ data, isVisitorBreak: false }) // 更新卡片上访客状态
      } else if (data.eventType === 'visitorFinish') { // 访客关闭会话事件
        WebchatModule.CLOSE_WEBCHAT_SESSION({ type: 'webchat_todo', id: data._id })
      } else if (data.eventType === 'autoClose') { // 自动结束会话
        WebchatModule.CLOSE_WEBCHAT_SESSION({ type: 'webchat_todo', id: data.sessionId })
        Message({ message: `${data.visitorName}长时间没有回复，系统自动为您关闭了会话`, type: 'success', duration: 5000, showClose: true })
      } else if (data.eventType === 'otherChat') {
        // 转接会话(redirect) 主动会话（initiating）vip专属座席（vipAgent）
        if (data.operation === 'redirect' || data.operation === 'initiating' || data.operation === 'vipAgent') {
          Vue.set(data, 'sessionType', data.operation) // 什么操作
          WebchatModule.SET_WEBCHAT_LIST({ submenu: 'webchat_todo', list: data, newChat: true })
          // 未读消息数
          Vue.set(data, 'leakNum', data.leakNum + 1)
          this.webchatNotify(data)
        }
      } else if (data.eventType === 'dealMsg') { // 访客消费消息通知座席端去更改消息状态
        WebchatModule.UPDATEDEALMSGSTATUS(data.sessionId)
      } else if (data.eventType === 'typeNotice') {
        // 更新访客预输入消息
        WebchatModule.UPDATE_PRELOADED_MSG(data)
        WebchatModule.SET_WEBCHAT_MESSAGE_CHANGE(data)
      } else if (data.eventType === 'refreshAgentUnDealNum') { // 排队会话数更新
        WebchatModule.SET_WEBCHAT_UNDEALNUM(data.unDealNum || 0)
      }
      if (data.type === 'leaveUndealCountInc') {
        WebchatModule.SET_LEAVE_NUM(data.leaveUndealCountInc || 0)
      }
      if (!['csrInvite'].includes(data.contentType)) { // 座席主动发送的系统消息不进行排序处理
        WebchatModule.SORTLISTBY_TYPE('webchat_todo') // 更新会话顺序
      }
    }
  }
}
export const WebchatEventModule = getModule(WebchatEvent)
